O que esperar das avaliações dos filmes do site GroupLens?

Vamos estimar, a partir de uma amostra de opiniões, os parâmetros da população de usuários do site de filmes GroupLens.

movies = read_csv("../dados/movies.csv")
ratings = read_csv("../dados/ratings.csv")
genres = read_csv("../dados/movie-genre.csv")
genres = genres %>%
  group_by(movieId, title) %>%
  summarise(nGenre = n())

O que esperar dos telespectadores em termos de avaliação de Resident Evil?

Ainda sobre o sucesso dos filmes de Resident Evil queremos saber o que esperar em termos de avaliação dos usuários do GroupLens. Quem são os usuários e como eles votam? Quais suas avaliações?

re_movies = movies %>% 
  filter(grepl("Resident Evil", title))

dados = merge(re_movies, ratings, by="movieId") %>%
  subset(select = -c(movieId, title, genres, timestamp))

Descritivo e decisões sobre filtrar dados ou variáveis

Antes de mais nada podemos nos perguntar: como se comporta a distribuição de avaliação de cada um dos usuários?

ggplotly(dados %>%
  ggplot(aes(x=as.character(userId),
             y=rating,
             color=as.character(userId))) +
  geom_jitter(width = .1) +
    geom_boxplot() +
  ggtitle("Distribuição da avaliação dos usuários") +
  ylab("Avaliação") +
  xlab("Usuário") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

Os gráficos acima mostram vários valores calculados a partir do conjunto de avaliações de cada usuário. Os quadrados ou box’s representam a distância interquartil (representam 50% das avaliações). As retas que cortam cada box são os valores de avaliação mediana.

Podemos observar no gráfico acima algumas coisas curiosas. A pior avaliação de Resident Evil foi do usuário de id 165 (0.5). As outras duas piores notas foram dos usuários 15 e 475 (1). Apenas dois usuários, 346 e 78, deram a nota mais alta (5).

Em termos de mediana de avaliação podemos observar duas coisas importantes no que compete a comparação dos telespectadores: os usuários que melhor avaliaram e os que pior avaliaram. Apenas o usuário de Id 78 melhor avaliou os filmes (4.75) e apenas o usuário 475 pior avaliou os filmes (2).

ggplotly(dados %>%
           ggplot(aes(x=as.character(userId),
                      color=as.character(userId),
                      fill=as.character(userId))) +
           geom_bar(width = .5) +
  ggtitle("Distribuição da quantidade de avaliações dos usuários") +
    scale_y_continuous(breaks = seq(1,3,1)) +
  ylab("Quantidade") +
  xlab("Usuário") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

Como podemos observar no gráfico acima, a maioria dos telespectadores votaram apenas uma vez e a quantidade máxima de avaliações observada é 3.

Estimando a avaliação dos telespectadores de Resident Evil

Qual seria a avaliação dos telespectadores de Resident Evil no site? Vamos estimar a mediana de avaliação populacional utilizando como métrica amostral a mediana de avaliação, juntamente com a técnica de bootstrap.

Você pode estar se perguntando: porque a mediana? A resposta é simples: a mediana é uma métrica que não é afetada ou enviesada por valores extremos ou outliers e também é uma métrica de tendência central dos dados. A técnica de bootstrap vai auxiliar no processo de reamostragem e cálculo do intervalo de confiança para a avaliação mediana populacional. Iremos utilizar 2000 replicações no processo de reamostragem e nível de confiança de 95%.

bootf <- function(x) {
    b =  bootstrap(x$rating, median, R = 2000)
    m = CI.percentile(b, probs = c(.025, .975))
    newstuff = rbind(m) %>%
      data.frame()
    return(newstuff)
}

dados.ci = dados %>%
  do(bootf(.)) %>%
  setNames(c("rating_lwr","rating_upr"))
dados.ci %>%
  ggplot(aes(x = "Usuários",
             ymin = rating_lwr,
             ymax = rating_upr,
             color=as.character("Usuários"))) + 
  geom_errorbar(width = .1) +
  labs(x="Usuário",
       y="Mediana de avaliação") +
  ggtitle("Intervalo de confiança da mediana de avaliação")+
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5))

Observando o gráfico acima podemos concluir com 95% de confiança que a mediana de avaliação populacional dos telespectadores dos filmes de Resident Evil no site GroupLens está entre 2.5 e 3.5.

O que esperar dos telespectadores em termos de avaliação de todos os filmes?

No tópico anterior estimamos a mediana de avaliação populacional dos telespectadores de Resident Evil e agora, de uma forma mais geral, vamos estimar a mediana de avaliação populacional dos telespectadores de todos os filmes.

dados = ratings %>%
  subset(select = -c(movieId,timestamp))

Descritivo e decisões sobre filtrar dados ou variáveis

O conjunto de dados contém muitas avaliações para cada um dos usuários do GroupLens mas em que ordem de magnitude estão essas quantidades?

ggplotly(dados %>%
  ggplot(aes(x=as.character(userId),
             color=as.character(userId))) +
  geom_bar() +
  ggtitle("Distribuição da quantidade de avaliações dos usuários") +
  ylab("Quantidade de avaliações") +
  xlab("Usuário") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

A ordem de magnitude varia muito e vão de centenas até a casa de milhar. Alguns usuários avaliaram menos de 500 filmes enquanto que outros avaliaram mais de 2000. A quantidade máxima de avaliações (2391) é observada pelo usuário de Id 547. Este usuário não está sozinho, há outros 4 usuários que também se destacam bastante em quantidade de avaliações.

Estimando a avaliação dos telespectadores de todos os filmes

Qual seria a avaliação dos telespectadores de todos os filmes do site? Vamos estimar a mediana de avaliação populacional utilizando como métrica amostral a mediana de avaliação juntamente com a técnica de bootstrap.

Se segue o mesmo motivo da seção anterior para a escolha da mediana. Novamente utilizaremos a técnica de bootstrap com número de replicações igual a 2000 e nível de confiança de 95%.

dados.ci = dados %>%
  do(bootf(.)) %>%
  setNames(c("rating_lwr","rating_upr"))

dados.ci %>%
  ggplot(aes(x = "Usuários",
             ymin = rating_lwr,
             ymax = rating_upr,
             color="Usuários")) + 
  geom_errorbar(width = .1) +
  labs(x="Usuário", y="Mediana de avaliação") +
  ggtitle("Intervalo de confiança da mediana de avaliação")+
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5))

Observando o gráfico acima podemos concluir com 95% de confiança que a mediana de avaliação populacional dos telespectadores de todos os filmes do site GroupLens é 4.

O que esperar dos telespectadores em termos de avaliação dos gêneros dos filmes?

Será que existe um gênero preferido dos telespectadores? Quais suas avaliações? Qual deles é o mais bem avaliado? Vamos estimar a mediana de avaliação populacional dos dois gêneros mais avaliados.

genres = read_csv("../dados/movie-genre.csv")
dados = merge(genres, ratings, by="movieId") %>%
  subset(select = -c(movieId, title, userId, timestamp))

Descritivo e decisões sobre filtrar dados ou variáveis

Inicialmente há algumas avaliações associadas a filmes que não contém gênero. Estas avaliações serão filtradas.

dados = dados %>% filter(genre != "(no genres listed)")

O conjunto de dados contém muitas avaliações para cada um dos gêneros dos filmes mas em que ordem de magnitude estão essas quantidades?

ggplotly(dados %>%
  ggplot(aes(x=genre,
             color=genre,
             fill=genre)) +
  geom_bar() +
  ggtitle("Distribuição da quantidade de avaliações dos gêneros") +
  ylab("Quantidade de avaliações") +
  xlab("Gênero") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

A ordem de magnitude varia muito na casa de milhar. Alguns gêneros foram avaliados menos de 10000 vezes enquanto que outros foram mais de 30000 vezes. A quantidade máxima de avaliações (43684) é observada pelo gênero de drama. Este gênero não está sozinho e é acompanhado por outros 3 gêneros que tamém se destacam bastante em quantidade de avaliações.

Observando agora apenas os gêneros de drama e comédia (dois gêneros mais avaliados): como se comportam a distribuição de avaliações desses gêneros?

dados = dados %>% 
  filter(genre %in% c("Comedy", "Drama"))

ggplotly(dados %>%
  ggplot(aes(x=genre,
             y=rating,
             color=genre)) +
    geom_boxplot() +
  ggtitle("Distribuição da avaliação dos gêneros") +
  ylab("Avaliação") +
  xlab("Gênero") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

Observando o gráfico acima podemos observar que além de ser o gênero que contém mais avaliações, o gênero de drama é também o gênero que contém maior avaliação em termos de mediana (4), se comparado ao segundo gênero que contém mais avaliações.

Estimando a avaliação dos telespectadores dos filmes de comédia e drama

Qual seria a avaliação dos telespectadores dos filmes de comédia e drama? Vamos estimar a mediana de avaliação populacional dos gêneros de comédia e drama utilizando como métrica amostral a mediana de avaliação juntamente com a técnica de bootstrap.

Se segue o mesmo motivo da primeira seção para a escolha da mediana. Novamente utilizaremos a técnica de bootstrap com número de replicações igual a 2000 e nível de confiança de 95%.

dados.ci = dados %>%
  group_by(genre) %>%
  do(bootf(.)) %>%
  setNames(c("genre","rating_lwr","rating_upr"))

dados.ci %>%
  ggplot(aes(x = genre,
             ymin = rating_lwr,
             ymax = rating_upr,
             color= genre)) + 
  geom_errorbar(width = .1) +
  labs(x="Gênero",
       y="Mediana de avaliação") +
  ggtitle("Intervalo de confiança da mediana de avaliação de cada gênero")+
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5))

Observando o gráfico acima podemos concluir com 95% de confiança que a mediana de avaliação do gênero comédia da população é de 3.5 e que a mediana de avaliação do gênero drama é 4. Podemos conluir ainda que a população dos usuários do GroupLens melhor avalia o gênero drama do que o gênero comédia.

Copyright © 2017 Marcos Nascimento